跳到主要内容

Kubernetes Volume Snapshots

KubernetesのVolume Snapshot機能は、PersistentVolume (PV) の特定時点の状態を保存するための標準的な方法を提供します。これにより、データベースのバックアップや開発環境へのデータ複製などが容易になります。

概要

Volume Snapshotは、ストレージシステム上のボリュームのコピーを作成する機能です。Kubernetes v1.20でGA(一般利用可能)となりました。CSI (Container Storage Interface) ドライバーがスナップショット機能をサポートしている場合に使用できます。Azure Disk や Azure Files などのAzureストレージサービスもCSIドライバーを通じてこの機能をサポートしています。

主なユースケース

  1. バックアップとリストア:

    • データベースやアプリケーションのデータを定期的に保護します。
    • 障害発生時やデータ破損時に、特定のスナップショットからボリュームを復元できます。
  2. データの複製(クローニング):

    • 本番環境のデータを開発・テスト環境にコピーして、トラブルシューティングや新機能のテストを行います。
    • 大規模なデータセットの分析用に複製を作成します。
  3. アプリケーションの移行:

    • あるクラスタから別のクラスタへデータを移動する際の中間ステップとして利用できます(ただし、スナップショット自体の移動には追加の手順やツールが必要な場合があります)。

アーキテクチャと主要リソース

Volume Snapshot機能は、以下の3つの主要なAPIリソースで構成されています。

1. VolumeSnapshotClass

StorageClassと同様に、スナップショットを作成するためのパラメータやドライバーを指定するクラスタレベルのリソースです。管理者が定義します。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
name: csi-azuredisk-vsc
driver: disk.csi.azure.com
deletionPolicy: Delete
parameters:
incremental: "true" # Azure Disk固有のパラメータ例

2. VolumeSnapshot

ユーザーがスナップショットの作成を要求するために作成するNamespacedリソースです。どのPersistentVolumeClaim (PVC) のスナップショットを取得するかを指定します。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: my-snapshot
namespace: default
spec:
volumeSnapshotClassName: csi-azuredisk-vsc
source:
persistentVolumeClaimName: my-pvc

3. VolumeSnapshotContent

実際のストレージシステム上のスナップショットを表すクラスタレベルのリソースです。PVとPVCの関係と同様に、VolumeSnapshotとVolumeSnapshotContentはバインドされます。通常は動的にプロビジョニングされます。

実装例:スナップショットからのリストア

スナップショットから新しいPVCを作成(リストア)するには、PVCの定義で dataSource フィールドを使用します。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
namespace: default
spec:
storageClassName: managed-csi
dataSource:
name: my-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

ベストプラクティス

  1. アプリケーションの静止点確保 (Quiescing):

    • ファイルシステムレベルのスナップショットは「クラッシュ整合性」しか保証しない場合があります。データベースなどでは、スナップショット取得前にメモリ上のデータをディスクにフラッシュし、書き込みを一時停止(フリーズ)することで「アプリケーション整合性」を確保することが推奨されます。
    • Hooksやツール(例: Velero)を使用して、スナップショット前後の処理を自動化しましょう。
  2. DeletionPolicyの適切な設定:

    • VolumeSnapshotClassdeletionPolicyDelete にすると、Kubernetes上の VolumeSnapshot オブジェクト削除時にストレージ上のスナップショットも削除されます。
    • 重要なバックアップの場合は Retain を検討し、誤削除を防ぐ運用を設計します。
  3. 定期的なバックアップ運用:

    • 手動での作成だけでなく、CronJobやバックアップツール(Velero, Kasten K10など)を導入して、定期的なスナップショット取得と世代管理を自動化します。
  4. リージョン/ゾーン冗長性の考慮:

    • Azure Diskのスナップショットは、作成元のディスクと同じリージョンに保存されます。災害対策(DR)を考慮する場合、スナップショットを別のリージョンにコピーする仕組み(Azure Backupなど)との併用を検討してください。

注意点

  • CSIドライバーの要件: 使用しているKubernetesクラスタとストレージのCSIドライバーがVolume Snapshot機能をサポートしている必要があります。
  • 容量とコスト: スナップショットはストレージ容量を消費します。特に差分スナップショットでない場合や、変更頻度が高い場合はコストに注意が必要です。不要になったスナップショットは定期的に削除しましょう。